home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Comm / tcp / BabelDoc.lha / BabelDoc / extra / TCPfuns.bb < prev   
Encoding:
Text File  |  2003-12-19  |  6.5 KB  |  229 lines

  1. ;-----------------------------------------------------------
  2. ; Standard Blitz TCP Functions V1.8 by Paul Burkey (c)1997-1998
  3. ; Compiled with help from Ercole Spiteri and Anton Reinauer
  4. ; You *must* have the bsdsocket.library setup in Blitz!!
  5. ; Contact me at burkey@bigfoot.com
  6. ; Updated to 1.9 in 2003 by Lorence Lombardo
  7. ; Contact me at lombi@iprimus.com.au
  8. ;-----------------------------------------------------------
  9. ;History
  10. ;-------
  11. ;<18.12.03> Version 1.9
  12. ;Fixed/Updated ReadTCP{} function. Added WaitSelect_ so that less CPU is
  13. ;used and an empty string (="") will now be the equivalent to an EOF.
  14. ;
  15. ;<16.2.97> Version 1.8
  16. ;Added NLPrintTCP{} for easy send string with carrage return and newline.
  17. ;Removed need for 3rd Party libs (only bsdsocket.library needed)
  18. ;
  19. ;<24.12.97> Version 1.7
  20. ;ReadTCP{} Updated with extra safety and Speed
  21. ;
  22. ;<18.9.97> Version 1.6
  23. ;Added PrintTCP{}  for an easy "send string" command.
  24. ;Added NPrintTCP{} for easy send string with carrage return
  25. ;CheckTCP{} merged into the ConnectTCP{} function.
  26. ;
  27. ;---------------
  28. ; Function List
  29. ;---------------
  30. ;
  31. ;ReadTCP{}                       ; Similar to Edit$() - recives data via TCP connection
  32. ;ReadMemTCP{ReadAdd.l,MaxSize.l} ; Similar to ReamMem - recives data via TCP connection
  33. ;WriteTCP{ad.l,size.w}           ; Similar to WriteMem - sends data via TCP connection
  34. ;ConnectTCP{host$,port.w}        ; Connect to a remote machine (Full error checking)
  35. ;PrintTCP{text$}                 ; Similar to Print - sends data via TCP connection
  36. ;NPrintTCP{text$}                ; Similar to NPrint - sends data via TCP connection
  37. ;NLPrintTCP{text$}               ; Similar to Print+CR+LF - sends data via TCP connection
  38. ;CloseTCP{}                      ; Closes TCP Connection
  39.  
  40. ;---------------------------------
  41. ; TCP library Variables/Constants
  42. ;---------------------------------
  43.  
  44. #TCPBuflen=$8192                ;Maximum data size to read at any time
  45. TCPmem.l=AllocMem(#TCPBuflen,0) ;Allocate the temp buffer used for all TCP reads
  46. #FIONREAD=$4004667f             ;FIONREAD request
  47.  
  48. ;---------------------------------
  49. ; Standard TCP library structures
  50. ;---------------------------------
  51.  
  52. NEWTYPE.list
  53.   *ItemA.b
  54.   *ItemB.b
  55. End NEWTYPE
  56. NEWTYPE.inaddr
  57.   s_addr.l
  58. End NEWTYPE
  59. NEWTYPE.sockaddrin
  60.   sin_len.b
  61.   sin_family.b
  62.   sin_port.w
  63.   sin_addr.inaddr
  64.   sin_zero.b[8]
  65. End NEWTYPE
  66. NEWTYPE.hostent
  67.   *h_name.b
  68.   *h_aliases.list
  69.   h_addrtype.l
  70.   h_lenght.l
  71.   *h_addr_list.list
  72. End NEWTYPE
  73.  
  74. ;---------------------------------
  75. ; Standard TCP Blitz Functions
  76. ;---------------------------------
  77.  
  78. .ReadTCP
  79. Function .s ReadTCP{}
  80.   SHARED sock.l,TCPmem.l
  81.   ;
  82.   ; This Function reads data from the server the result is passed back in a
  83.   ; string. If there is no messages then it will return an empty string =""
  84.   ;
  85.   sockread.l=0                                ;Clear Readmask
  86.   sockread.l BitSet sock.l                    ;Set Readmask on our socket
  87.   g.l=WaitSelect_(2,&sockread.l,0,0,0,0)      ;Wait until there is some data to read
  88.   e.l=IoctlSocket_(sock.l,#FIONREAD,TCPmem.l) ;How much data is there?
  89.   f.l=Peek.l(TCPmem.l)                        ;Place value in f
  90.   If f>0
  91.     If f>#TCPBuflen Then f=#TCPBuflen         ;Don't read more than #TCPBuflen
  92.     c=recv_(sock.l,TCPmem.l,f,0)              ;Read all Data
  93.     c$=String$(" ",f)                         ;Reserve String
  94.     CopyMem_ TCPmem.l,&c$,f                   ;Copy Data to string
  95.     Function Return c$
  96.   Else
  97.     Function Return ""
  98.   EndIf
  99. End Function
  100.  
  101.  
  102. ;----
  103. ;WARNING: This is a 'rough' experiment function.
  104. ;Function will probably change next update.
  105. ;----
  106.  
  107. .ReadMemTCP
  108. Function .l ReadMemTCP{ReadAdd.l,MaxSize.l}
  109.   SHARED sock.l,TCPmem.l
  110.   ;
  111.   ; Read into memory location 'ReadAdd.l' up to a maximum of 'MaxSize.l'
  112.   ; Used for reading long binary files eg, WWW files or FTP files.
  113.   ; Also returns the amount of bytes actually read.
  114.   ;
  115.   sockread.l=0                                ;Clear Readmask
  116.   sockread.l BitSet sock.l                    ;Set Readmask on our socket
  117.   e.l=IoctlSocket_(sock.l,#FIONREAD,TCPmem.l) ;How much data is there?
  118.   f.l=Peek.l(TCPmem.l)                        ;Place value in f
  119.   If f>0
  120.     If f>#TCPBuflen Then f=#TCPBuflen         ;Don't read more than #TCPBuflen
  121.     If f>MaxSize Then f=MaxSize               ;Don't read more than MaxSize
  122.     c=recv_(sock.l,ReadAdd.l,f,0)             ;Read Data to ReadAdd location
  123.     Function Return f
  124.   Else
  125.     Function Return 0
  126.   EndIf
  127.   ;
  128. End Function
  129.  
  130.  
  131.  
  132. .WriteMemTCP
  133. Statement WriteMemTCP{ad.l,size.w}
  134.   SHARED sock.l
  135.   ;
  136.   ; This routine writes data via TCP.
  137.   ;
  138.   sockwrite.l=0                           ;Clear Writemask
  139.   sockwrite.l BitSet sock.l               ;set Writemask on our socket
  140.   g.l=WaitSelect_(2,0,&sockwrite.l,0,0,0) ;Wait until server is ready to read our data
  141.   c.l=send_(sock.l,ad,size,0)             ;Send data to server
  142. End Statement
  143.  
  144.  
  145.  
  146. .ConnectTCP
  147. Function .b ConnectTCP{host$,port.w}
  148.   SHARED sock.l
  149.   ;
  150.   ; Check if Miami/AmiTCP stack is available
  151.   ; Connect to host at specified port
  152.   ; Return true or False if Connection is made
  153.  
  154.   SocketBase.l=OpenLibrary_("bsdsocket.library",0)
  155.   If SocketBase=0
  156.     Function Return False
  157.   Else
  158.     CloseLibrary_(SocketBase)
  159.     sock.l=socket_(2,1,0)
  160.     *a.hostent=gethostbyname_(host$)
  161.     If *a=0
  162.       Function Return False   ; host not found (or internal TCP error)
  163.     Else
  164.       ;
  165.       ; Copy Details to our Sockaddrin structure
  166.       ;
  167.       CopyMem_ *a\h_addr_list\ItemA,&host.sockaddrin\sin_addr,*a\h_lenght
  168.       host.sockaddrin\sin_port=port       ;Set port number
  169.       host.sockaddrin\sin_family=2        ;Set type to AT_INET
  170.       StructLength.l=SizeOf .sockaddrin   ;Get lenght of structure sockaddrin
  171.       If connect_(sock.l,host.sockaddrin,StructLength)=-1
  172.         CloseSocket_(sock.l)
  173.         Function Return False
  174.       Else
  175.         Function Return True
  176.       EndIf
  177.     EndIf
  178.   EndIf
  179. End Function
  180.  
  181.  
  182.  
  183. .PrintTCP
  184. Statement PrintTCP{text$}
  185.   ;
  186.   ; Send String via TCP
  187.   ;
  188.   WriteMemTCP{&text$,Len(text$)}
  189. End Statement
  190.  
  191.  
  192.  
  193. .NPrintTCP
  194. Statement NPrintTCP{text$}
  195.   ;
  196.   ; Send String via TCP + Carrage Return
  197.   ;
  198.   text$=text$+Chr$(13)
  199.   WriteMemTCP{&text$,Len(text$)}
  200. End Statement
  201.  
  202.  
  203.  
  204. .NLPrintTCP
  205. Statement NLPrintTCP{text$}
  206.   ;
  207.   ; Send String via TCP + Carrage Return + Line Feed
  208.   ;
  209.   text$=text$+Chr$(13)+Chr$(10)
  210.   WriteMemTCP{&text$,Len(text$)}
  211. End Statement
  212.  
  213.  
  214.  
  215. .CloseTCP
  216. Statement CloseTCP{}
  217.   SHARED sock.l
  218.   ;
  219.   ; This is a simple close socket command
  220.   ; Provided for the shear hell of it :)
  221.   ;
  222.   CloseSocket_(sock.l)
  223. End Statement
  224.  
  225. ;-------------------------
  226. ;End of TCP Routines
  227. ;-------------------------
  228.  
  229.